home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 422_02 / microcad / fe.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-03-20  |  3.8 KB  |  148 lines

  1. /*
  2.  * Font editor for MICROCAD and FAX25 programs.
  3.  *
  4.  * Copyright 1991-1994 Dave Dunfield
  5.  * All rights reserved.
  6.  *
  7.  * Permission granted for personal (non-commercial) use only.
  8.  *
  9.  * Compile command: cc fe -fop
  10.  */
  11. #include <stdio.h>
  12. #include <video.h>
  13. #include <file.h>
  14.  
  15. unsigned font[96][24];        /* Font buffer */
  16.  
  17. char *menu1[] = {            /* Termination menu */
  18.     "Resume editing  ",
  19.     "Save FONT & exit",
  20.     "Quit/Don't save ",
  21.     0 };
  22.  
  23. main(argc, argv)            /* Main program */
  24.     int argc;
  25.     char *argv[];
  26. {
  27.     unsigned cnum, cbuf[24], c, x, y, i, j;
  28.     HANDLE fh;
  29.  
  30.     if(argc < 2)
  31.         abort("Font Editor\n\nUse: FE <font file>\n\nCopyright 1991-1994 Dave Dunfield\nAll rights reserved.\n");
  32.  
  33.     for(i=0; i < 24; ++i)
  34.         cbuf[i] = 0;
  35.     memset(font, x = y = cnum = 0, sizeof(font));
  36.  
  37.     vopen();
  38.  
  39.     vgotoxy(40, 4); vprintf("File: '%s'", argv[1]);
  40.     if(fh = open(argv[1], F_READ)) {
  41.         read(font, sizeof(font), fh);
  42.         close(fh);
  43.         reverse(); }
  44.     else {
  45.         vputs("  ** NEW **"); }
  46.  
  47.     vgotoxy(40,  6); vputs("Space   = Toggle bit value");
  48.     vgotoxy(40,  7); vputs("Home    = Clear character");
  49.     vgotoxy(40,  8); vputs("PgDn    = Next character");
  50.     vgotoxy(40,  9); vputs("Pgup    = Previous character");
  51.     vgotoxy(40, 10); vputs("F1      = Shift line left");
  52.     vgotoxy(40, 11); vputs("F2      = Shift line right");
  53.     vgotoxy(40, 12); vputs("F3      = Goto character");
  54.     vgotoxy(40, 13); vputs("ESC     = Undo changes");
  55.     vgotoxy(40, 14); vputs("End     = Exit FONT editor");
  56.  
  57.     memcpy(cbuf, font[cnum], sizeof(cbuf));
  58.  
  59. top:    /* Draw the initial character */
  60.     for(i=0; i < 24; ++i) {
  61.         vgotoxy(0, i);
  62.         vprintf("%2u  ", i+1);
  63.         c = cbuf[i];
  64.         for(j=0; j < 16; ++j) {
  65.             vputs(c & 0x8000 ? "\xDB\xDB" : "\xFA ");
  66.             c <<= 1; } }
  67.     vgotoxy(8, 24); vprintf("Char ID = %-2u, '", cnum);
  68.     vputc(cnum+' ' | 0xFF00); vprintf("' (%02x)", cnum+' ');
  69.  
  70.     /* Edit the matrix */
  71.     vcursor_off();
  72.     for(;;) {
  73.         vgotoxy(x+x+4, y);
  74.         vputs((i = cbuf[y] & (0x8000 >> x)) ? "\xB2\xB2" : "\xB0\xB0");
  75.         vgotoxy(x+x+4, y);
  76.         c = vgetc();
  77.         vputs(i ? "\xDB\xDB" : "\xFA ");
  78.         switch(c) {
  79.             case _KUA :    y = y ? y-1 : 23;            break;
  80.             case _KDA : y = (y >= 23) ? 0 : y+1;    break;
  81.             case _KLA : x = x ? x-1 : 15;            break;
  82.             case _KRA : x = (x >= 15) ? 0 : x+1;    break;
  83.             case _KPU :
  84.                 memcpy(font[cnum], cbuf, sizeof(cbuf));
  85.                 memcpy(cbuf, font[cnum = cnum ? cnum-1 : 95], sizeof(cbuf));
  86.                 goto top;
  87.             case _KPD :
  88.                 memcpy(font[cnum], cbuf, sizeof(cbuf));
  89.                 memcpy(cbuf, font[cnum = (cnum >= 95) ? 0 : cnum+1], sizeof(cbuf));
  90.                 goto top;
  91.             case ' '  :
  92.                 vgotoxy(x+x+4, y);
  93.                 c = cbuf[y] ^= 0x8000 >> x;
  94.                 vputs(c & (0x8000 >> x) ? "\xDB\xDB" : "\xFA ");
  95.                 break;
  96.             case _K1  : cbuf[y] <<= 1;    goto top;
  97.             case _K2  : cbuf[y] >>= 1;    goto top;
  98.             case _K3  :
  99.                 vgotoxy(40, 16);
  100.                 vputs("Enter character? ");
  101.                 vcursor_line();
  102.                 c = vgetc() - ' ';
  103.                 vcursor_off();
  104.                 vgotoxy(40, 16);
  105.                 vcleol();
  106.                 if(c > 95) {
  107.                     vputc(7);
  108.                     break; }
  109.                 memcpy(font[cnum], cbuf, sizeof(cbuf));
  110.                 cnum = c;
  111.             case 0x1B :    memcpy(cbuf, font[cnum], sizeof(cbuf)); goto top;
  112.             case _KHO : memset(cbuf, 0, sizeof(cbuf)); goto top;
  113.             case _KEN :
  114.                 c = 0;
  115.                 vmenu(40, 16,menu1,-1,&c);
  116.                 switch(c) {
  117.                     case 1 :
  118.                         memcpy(font[cnum], cbuf, sizeof(cbuf));
  119.                         if(fh = open(argv[1], F_WRITE)) {
  120.                             reverse();
  121.                             write(font, sizeof(font), fh);
  122.                             close(fh); }
  123.                         else {
  124.                             vgotoxy(40, 24);
  125.                             vputs("Cannot open output file");
  126.                             break; }
  127.                     case 2 :
  128.                         vclscr();
  129.                         vcursor_line();
  130.                         return; } } }
  131. }
  132.  
  133. /*
  134.  * Reverse the font data to compensate for the "little endian"
  135.  * architecture of the intel format unsigned data type.
  136.  */
  137. reverse()
  138. {
  139.     char *ptr, c;
  140.     int i;
  141.  
  142.     ptr = (char *) font;
  143.     for(i=0; i < sizeof(font); i += 2) {
  144.         c = *ptr;
  145.         *ptr = *++ptr;
  146.         *ptr++ = c; }
  147. }
  148.